package main

import "fmt"

// ---------------------- 子系统：投影仪 ----------------------
type Projector struct{}

func (p *Projector) TurnOn() {
	fmt.Println("投影仪启动：HDMI信号接入")
}

func (p *Projector) SetMode(cinemaMode bool) {
	if cinemaMode {
		fmt.Println("投影模式切换为：影院模式")
	}
}

func (p *Projector) TurnOff() {
	fmt.Println("投影仪关闭")
}

// ---------------------- 子系统：音响系统 ----------------------
type SoundSystem struct{}

func (s *SoundSystem) EnableSurround() {
	fmt.Println("音响系统：环绕声开启")
}

func (s *SoundSystem) SetVolume(level int) {
	fmt.Printf("音响音量调整至：%d%%\n", level)
}

func (s *SoundSystem) PowerOff() {
	fmt.Println("音响系统关闭")
}

// ---------------------- 子系统：智能灯光 ----------------------
type Lighting struct{}

func (l *Lighting) Dim(brightness int) {
	fmt.Printf("灯光调暗至：%d%%\n", brightness)
}

func (l *Lighting) Restore() {
	fmt.Println("灯光恢复常亮")
}

// ---------------------- 外观类：家庭影院控制中心 ----------------------
type HomeTheaterFacade struct {
	projector *Projector
	sound     *SoundSystem
	lighting  *Lighting
}

func NewHomeTheaterFacade() *HomeTheaterFacade {
	return &HomeTheaterFacade{
		projector: &Projector{},
		sound:     &SoundSystem{},
		lighting:  &Lighting{},
	}
}

// 聚合操作：一键启动观影模式
func (h *HomeTheaterFacade) WatchMovie() {
	fmt.Println("\n=== 启动家庭影院 ===")
	h.lighting.Dim(10)        // 灯光调暗
	h.projector.TurnOn()      // 开启投影
	h.projector.SetMode(true) // 设置影院模式
	h.sound.EnableSurround()  // 开启环绕声
	h.sound.SetVolume(60)     // 设置音量
	fmt.Println("=== 准备就绪 ===\n")
}

// 聚合操作：一键关闭所有设备
func (h *HomeTheaterFacade) EndMovie() {
	fmt.Println("\n=== 关闭家庭影院 ===")
	h.sound.SetVolume(0)
	h.sound.PowerOff()
	h.projector.TurnOff()
	h.lighting.Restore()
	fmt.Println("=== 已关闭 ===\n")
}

// ---------------------- 客户端调用 ----------------------
func main() {
	// 普通用户通过外观类操作
	homeTheater := NewHomeTheaterFacade()

	// 一键观影（隐藏所有技术细节）
	homeTheater.WatchMovie()

	// 一键关闭
	homeTheater.EndMovie()

	// 高级用户仍可直接访问子系统
	// homeTheater.projector.SetMode(false)
}
